import axios from 'axios'
import option from './local/option-api'
import encrypt from './local/encrypt-api'
import constants from './remote/constants'
import account from './remote/account-api'


//设置默认的http访问参数
axios.defaults.timeout=constants.REMOTE_TIMEOUT
axios.defaults.baseURL=constants.REMOTE_BASE_URL

/**
 * HTTP请求拦截器
 * 如果当前Session持有JWT Token,每次请求服务端的时候自动带上该令牌
 * 
 */
axios.interceptors.request.use(
    req=>{
        //如果访问的不是OAuth授权服务的Endpoint
        if(req.baseURL !== constants.AUTH_BASE_URL){
            //并且Session有效，就自动在请求Header中带上jwt令牌
            if(option.isSessionAvailable()){
                req.headers = {
                    'Authorization': constants.AUTH_TOKEN_TYPE + option.getSession().access_token
                }
            }
        }
        return req
    },error =>{
        return Promise.reject(error)
    })

/**
 * HTTP响应拦截器
 * 将返回非200状态的HTTP CODE和无响应均调用promise reject
 */
 axios.interceptors.response.use(res => {
    if (res.data && res.data.code && res.data.code !== 0) {
      return Promise.reject(Error(res.data.message))
    } else {
      return Promise.resolve(res)
    }
  }, error => {
    console.error('远程服务未能成功发送：', error)
    // 尝试提取服务端错误
    const res = error.response
    if (res && res.data) {
      console.error(res.data)
      if (res.data.error && res.data.error_description) {
        // OAuth令牌Endpoint的错误格式：{error:"",error_description:""}
        const message = `HTTP Code:${res.status}, 信息:[${res.data.error}] ${res.data.error_description}`
        return Promise.reject(Error(message))
      } else if (res.data.code && res.data.message) {
        // 服务端CommonResponse的错误格式：{code:xx,message:""}
        return Promise.reject(Error(res.data.message))
      } else if (res.data.error && res.data.message) {
        // Jersey的默认错误格式：{status:xx,timestamp:"",error:"",message:xx}
        const message = `HTTP Code:${res.status}, 信息:[${res.data.error}] ${res.data.message}`
        return Promise.reject(Error(message))
      }
    }
    return Promise.reject(error)
  })

export default{
    encrypt,
    option,
    
    constants,
    account

}